home *** CD-ROM | disk | FTP | other *** search
- /* DAL handling routines */
-
- #include <string.h>
- #include "cl1api.h"
- #include "cl1err.h"
- #include "DalDemo.h"
-
- extern Rect gOutRect;
- extern CharsHandle gInText;
- long sessionId;
- long gTimer;
- long gCounter;
- int gDALState;
- Boolean gDALActive, gDALMonitor, gDALNewCodeFrag;
-
- /***These first few routines provide basic utilities without relying upon
- outside libraries--trying to keep the executable small***/
-
- /***StrLen***/
- int StrLen(s)
- char *s;
- {
- int n;
-
- for (n = 0; *s != '\0'; s++) n++;
- return n;
- }
-
- /***StrToOut***/
- void StrToOut(demoWind,str)
- demoPeek demoWind;
- char *str;
- {
- long len;
-
- if ((len = (long) StrLen(str)) != 0)
- {
- TESetSelect(32767,32767,demoWind->outputTE);
- TEInsert(str,len,demoWind->outputTE);
- }
- }
-
- /***IntToOut***/
- void IntToOut(demoWind,num)
- demoPeek demoWind;
- int num;
- {
- int i,j,c,sign;
- char str[24];
-
- if ((sign = num) < 0)
- num = -num;
- i = 0;
- do {
- str[i++] = num % 10 + '0';
- } while ((num /= 10) > 0);
- if (sign < 0)
- str[i++] = '-';
- str[i] = '\0';
- for (i = 0, j = StrLen(str); i < j; i++, j--)
- c = str[i], str[i] = str[j-1], str[j-1] = c;
- StrToOut(demoWind,str);
- }
-
- /***NLToOut***/
- void NLToOut(demoWind)
- demoPeek demoWind;
- {
- TEKey(TE_CARRIAGE_RETURN,demoWind->outputTE);
- }
-
- /***Provide a static method for displaying 'english' meaning to numeric err
- messages**/
-
- void DALTransErr(demoWind,err)
- demoPeek demoWind;
- int err;
- {
- switch (err)
- {
- case A_OK: StrToOut(demoWind,"OK/VAL ");
- break;
- case A_NULL: StrToOut(demoWind,"NULL ");
- break;
- case A_ERROR: StrToOut(demoWind,"ERROR ");
- break;
- case A_READY: StrToOut(demoWind,"READY ");
- break;
- case A_BADTYPE: StrToOut(demoWind,"BADTYPE ");
- break;
- case A_BREAK: StrToOut(demoWind,"BREAK ");
- break;
- case A_EXEC: StrToOut(demoWind,"EXEC ");
- break;
- case A_NOTCONN: StrToOut(demoWind,"NOTCONN ");
- break;
- case A_SESSMAX: StrToOut(demoWind,"SESSMAX ");
- break;
- case A_INUSE: StrToOut(demoWind,"INUSE ");
- break;
- case A_NOHOST: StrToOut(demoWind,"NOHOST ");
- break;
- default:
- StrToOut(demoWind,"unknown error ");
- }
- }
-
- /***Create the session link***/
- void DALOpenLink(demoWind,node,user,pass)
- demoPeek demoWind;
- char *node, *user, *pass;
- {
- int err;
-
- PtoCstr(node);
- PtoCstr(user);
- PtoCstr(pass);
- sessionId = -1L;
-
- err = CLInit(&sessionId,node,user,pass,"\0");
- if (err != A_OK)
- DALErrorHandler(demoWind,err);
- else
- {
- gDALActive = TRUE;
- StrToOut(demoWind,"OpenLink:Connection established");
- NLToOut(demoWind);
- }
- }
-
- /***DALSendExecute will send the fragment found in the input buffer
- and instruct the server to execute it if no errors occur during transmission***/
-
- void DALSendExecute(demoWind)
- demoPeek demoWind;
- {
- int len;
- int err;
- TEPtr te;
-
- te = *(demoWind->curTE);
- if ((len = te->teLength) == 0) return;
-
- SwitchToNewArea(demoWind);
- NLToOut(demoWind);
- StrToOut(demoWind,"<Sending and Executing>");
- NLToOut(demoWind);
- TEPaste(demoWind->curTE);
- NLToOut(demoWind);
- AdjustScrollBar(demoWind);
- SwitchToNewArea(demoWind);
- gDALNewCodeFrag = TRUE;
-
- HLock(gInText);
- err = CLSend(sessionId,*gInText,len);
- HUnlock(gInText);
- if (err != A_OK)
- DALErrorHandler(demoWind,err);
- else
- {
- err = CLExec(sessionId);
- if (err != A_OK)
- DALErrorHandler(demoWind,err);
- }
- }
-
- /***DALMonitorState is used to find the server state on a periodic basis***/
- void DALMonitorState(demoWind)
- demoPeek demoWind;
- {
- int err;
- long ticks;
-
- if ((ticks = TickCount()) >= gTimer)
- {
- gTimer += DAL_MONITOR_INTERVAL;
- ++gCounter;
- err = CLState(sessionId);
- if (err == A_ERROR && gDALNewCodeFrag)
- DALErrorHandler(demoWind,err);
-
- if (gDALMonitor) DALDisplayState(demoWind);
- if (gDALState == A_VALUE && gDALNewCodeFrag) DALReadLink(demoWind);
- }
- }
-
- /***DALErrorHandler gets additional error status messages from server***/
- void DALErrorHandler(demoWind,err)
- demoPeek demoWind;
- int err;
- {
- long errp;
- long err2p;
- char itm1[80];
- char itm2[80];
- char msg[80];
-
- gDALState = CLGetErr(sessionId, &errp, &err2p, itm1, itm2, msg);
- NLToOut(demoWind);
- DALTransErr(demoWind,err);
- StrToOut(demoWind,msg);
- NLToOut(demoWind);
- gDALNewCodeFrag = FALSE;
- }
-
- /***DALDisplayState***/
- void DALDisplayState(demoWind)
- demoPeek demoWind;
- {
- DALTransErr(demoWind,gDALState);
- }
-
- /***DALCloseSession does a clean shutdown***/
- void DALCloseLink(demoWind)
- demoPeek demoWind;
- {
- int err;
-
- err = CLEnd(sessionId);
- if (err != A_OK)
- DALErrorHandler(demoWind,err);
- else
- gDALActive = FALSE;
- }
-
- /***DALReadLink gets data from the server when ready***/
- void DALReadLink(demoWind)
- demoPeek demoWind;
- {
- short typep;
- short lenp;
- short placep;
- short flagsp;
- Ptr buffer[DAL_MAXCOL];
- int err;
- short maxCol;
- short bIndex;
- Boolean firstRow;
-
- /* do informational wait loop checking for data */
-
- firstRow = TRUE;
- bIndex = 0;
- maxCol = 0;
- buffer[bIndex] = (Ptr) NIL;
-
- typep = A_ANYTYPE;
- err = CLGetItem(sessionId, DAL_MONITOR_INTERVAL/4, &typep, &lenp, &placep, &flagsp,
- NIL);
- if (err < A_VALUE) return;
-
- StrToOut(demoWind,"<Reading Program Output>");
- NLToOut(demoWind);
-
- while (err != A_ERROR && err != A_READY)
- {
- typep = A_ANYTYPE;
- err = CLGetItem(sessionId, AW_FOREVER, &typep, &lenp, &placep, &flagsp,
- NIL);
- if (err != A_VALUE) break;
- /* if this is the first row, set up buffer space for each column's data */
- if (firstRow)
- {
- switch (typep)
- {
- case A_BOOLEAN:
- case A_SMINT:
- case A_INTEGER:
- case A_SMFLOAT:
- case A_DATE:
- case A_TIME:
- case A_TIMESTAMP:
- lenp = 8;
- break;
- case A_VCHAR:
- case A_CHAR:
- lenp += 1; /* add one for null character termination */
- break;
- default:
- break;
- }
- if ((buffer[bIndex] = NewPtr(lenp)) == NIL) ErrorHandler(NO_MEMORY);
- /* check to see if this is the last colitem in this row...
- last time to grab pointers for this data request */
- firstRow = !(flagsp & AF_RECEND);
- }
- else
- {
- switch (typep)
- {
- case A_VCHAR:
- case A_CHAR:
- DisposPtr(buffer[bIndex]);
- lenp += 1; /* add one for null character termination */
- if ((buffer[bIndex] = NewPtr(lenp)) == NIL) ErrorHandler(NO_MEMORY);
- break;
- default:
- break;
- }
- } /*else*/
- if (bIndex > maxCol) maxCol = bIndex;
- err = CLGetItem(sessionId, AW_FOREVER, &typep, &lenp, &placep, &flagsp,
- buffer[bIndex]);
- if (err != A_VALUE && err != A_NULL) break;
- if (flagsp & AF_RECEND)
- {
- DALDisplayRow(demoWind,buffer,bIndex);
- bIndex = 0;
- }
- else
- ++bIndex;
- } /*while*/
- /* free up memory */
- bIndex = 0;
- while (maxCol-- >= 0)
- DisposPtr(buffer[bIndex++]);
- NLToOut(demoWind);
-
- } /*DALReadLink*/
-
- /***DALDisplayRow***/
- void DALDisplayRow(demoWind,buffer,bufLen)
- demoPeek demoWind;
- Ptr *buffer;
- int bufLen;
- {
- int i;
-
- for (i = 0; i <= bufLen; i++)
- {
- StrToOut(demoWind,(char *) buffer[i]);
- StrToOut(demoWind," ");
- }
-
- NLToOut(demoWind);
- }